package model

import (
	"go-gin-api/util"
	"gorm.io/gorm"
)

// User 用户
type User struct {
	ID        uint64 `gorm:"primaryKey;column:id;type:bigint(20) unsigned;not null"`
	CreatedAt int64  `gorm:"column:created_at;type:bigint(20);default:null"`
	UpdatedAt int64  `gorm:"column:updated_at;type:bigint(20);default:null"`
	DeletedAt int64  `gorm:"index:idx_users_deleted_at;column:deleted_at;type:bigint(20);default:null"`
	LoginName string `gorm:"column:login_name;type:varchar(20);not null"`
	Password  string `gorm:"column:password;type:varchar(64);not null"`
	Email     string `gorm:"column:email;type:varchar(20);not null"`
	NiceName  string `gorm:"column:nice_name;type:varchar(20);not null"`
	Sex       int    `gorm:"column:sex;type:int(11);default:null"`
	Role      int64  `gorm:"column:role;type:bigint(20);default:null;default:2"`
	Avatar    string `gorm:"column:avatar;type:varchar(200);not null"`
	UserName  string `gorm:"column:user_name;type:varchar(20);not null"` // 头像
}

func NewUser() *User {
	return new(User)
}

// 在模型里，写数据库操作的方法

// CheckUser 查询用户是否存在
func (u *User) CheckUser(db *gorm.DB, name string) (err error) {
	//最好不要用first
	err = db.Debug().Where("nice_name = ?", name).Find(&u).Limit(1).Error
	return
}

// GetUser 查询用户
func (u *User) GetUser(db *gorm.DB) (err error) {
	//最好不要用first
	err = db.Debug().Where("id = ?", u.ID).Find(&u).Limit(1).Error
	return
}

// CreateUser 添加用户
func (u *User) CreateUser(db *gorm.DB) (err error) {
	u.Password = util.ScryptPassword(u.Password) // 密码转为加密的。（另一个方法是用GORM的勾子BeforeSave()前加密）
	err = db.Debug().Create(&u).Error
	return
}

// GetUser 查询单个用户
//func GetUser(c *gin.Context) {
//
//}

// GetUsers 查询用户列表。牵扯到分页。
func (u *User) GetUsers(db *gorm.DB, pageSize int, currPageNum int) ([]User, int64) {
	var users []User
	var total int64 // 查询到的记录的总条数。为了方便分页
	err := db.Limit(pageSize).Offset((currPageNum - 1) * pageSize).Find(&users).Count(&total).Error
	if err != nil && err != gorm.ErrRecordNotFound {
		return nil, 0
	}
	return users, total
}

// EditUser 编辑用户。不含修改密码。修改/重置密码是一个单独的接口。map传参比struct传参，0值也会更新，所以用map
func (u *User) EditUser(db *gorm.DB, id int, data *User) (err error) {
	var maps = make(map[string]interface{})
	maps["loginName"] = data.LoginName
	maps["email"] = data.Email
	maps["niceName"] = data.NiceName
	maps["sex"] = data.Sex
	maps["role"] = data.Role
	maps["avatar"] = data.Avatar
	err = db.Model(&User{}).Where("id = ?", id).Save(&maps).Error
	return
}

// DeleteUser 删除用户
func (u *User) DeleteUser(db *gorm.DB, id int) (err error) {
	var user User
	err = db.Where("id = ?", id).Delete(&user).Error
	return
}

// CheckLogin 登录验证
func (u *User) CheckLogin(db *gorm.DB, loginName string) (err error) {

	db.Where("login_name =?", loginName).First(&u)

	/*	if user.ID == 0 {
			return errmsg.ERROR_USER_NOT_EXIST
		}
		if util.ScryptPassword(password) != user.Password {
			return errmsg.ERROR_PASSWORD
		}
		//if user.Role != 1 {
		//	return errmsg.ERROR_USER_NO_RIGHT
		//}
		return errmsg.SUCCESS
	*/
	return
}
